/**
 * 创建应用脚本
 */
const fs = require('fs-extra');
const path = require('path');
const inquirer = require('inquirer');
const chalk = require('chalk');
const ora = require('ora');
const { v4: uuid } = require('uuid');
const { getTemplates, getTemplatePath } = require('./templates');

// 工作目录
const WORK_DIR = process.cwd();

/**
 * 创建新应用
 * @param projectName {string} 项目名称
 * @param {Object} options 应用配置选项
 * @returns {Promise<Object>} 创建结果
 */
async function createApp(projectName, options) {
  const {
    name,
    description,
    version,
    author,
    template,
    packageManager = 'npm'
  } = options;

  const spinner = ora('准备创建应用...').start();

  try {
    // 如果projectName为绝对路径，则使用绝对路径
    const appDir = path.isAbsolute(projectName) ? projectName : path.join(WORK_DIR, projectName);

    // 检查目录是否存在
    if (fs.existsSync(appDir)) {
      throw new Error(`应用目录已存在: ${appDir}`);
    }

    // 获取模板路径
    spinner.text = `查找模板 ${template}...`;
    let templateDir;

    try {
      templateDir = await getTemplatePath(template);
    } catch (err) {
      throw new Error(`模板不存在: ${template}`);
    }

    // 复制模板文件
    spinner.text = '复制模板文件...';
    fs.ensureDirSync(appDir);
    await fs.copy(templateDir, appDir);

    // 创建应用配置
    const appConfig = {
      name: projectName,
      appName: name,
      description: description || `${name}应用`,
      version: version || '0.1.0',
      author: author || process.env.USER || 'Unknown',
      appId: '通过simpletools注册获取',
      appHome: 'https://www.app.com',
      package: {
        packageDir: './src',
        buildOutDir: './appdist',
      }
    };

    // 保存配置
    spinner.text = '保存应用配置...';
    await fs.writeJSON(path.join(appDir, 'app.json'), appConfig, { spaces: 2 });

    spinner.succeed(`应用创建成功! 目录: ${appDir}`);

    return {
      name,
      description,
      version,
      author,
      path: appDir
    };
  } catch (err) {
    spinner.fail(`创建应用失败: ${err.message}`);
    throw err;
  }
}

/**
 * 交互式创建应用
 * @param projectName {string} 项目名称
 * @returns {Promise<Object>} 创建结果
 */
async function createAppInteractive(projectName) {
  try {
    // 获取可用模板
    console.log('正在加载模板...');
    const templates = await getTemplates();

    if (templates.length === 0) {
      throw new Error('没有可用的模板');
    }

    // 准备模板选择列表
    const templateChoices = templates.map(t => ({
      name: `${t.name} - ${t.description} ${t.source === 'workspace' ? '[用户]' : '[内置]'}`,
      value: t.id
    }));

    // 询问应用信息
    const answers = await inquirer.prompt([
      {
        type: 'input',
        name: 'name',
        message: '应用名称:',
        validate: (input) => input.trim() !== '' ? true : '请输入应用名称'
      },
      {
        type: 'input',
        name: 'description',
        message: '应用描述:',
        default: (answers) => `${answers.name}应用`
      },
      {
        type: 'input',
        name: 'version',
        message: '版本号:',
        default: '0.1.0'
      },
      {
        type: 'input',
        name: 'author',
        message: '作者:',
        default: process.env.USER || 'Unknown'
      },
      {
        type: 'list',
        name: 'template',
        message: '选择模板:',
        choices: templateChoices,
        default: 'default'
      }
    ]);

    // 创建应用
    return await createApp(projectName, answers);
  } catch (err) {
    console.error(chalk.red(`错误: ${err.message}`));
    throw err;
  }
}

module.exports = {
  createApp,
  createAppInteractive
};
